package 单调栈;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @PackageName: 单调栈
 * @ClassName: LeetCode853
 * @Author: chen jinxu
 * @Date: 2022/8/5 21:32
 * @Description: //车队
 * 在一条单行道上，有 n 辆车开往同一目的地。目的地是几英里以外的target。
 * 给定两个整数数组position和speed，长度都是 n ，其中position[i]是第 i 辆车的位置，speed[i]是第 i 辆车的速度(单位是英里/小时)。
 * 一辆车永远不会超过前面的另一辆车，但它可以追上去，并与前车 以相同的速度 紧接着行驶。此时，我们会忽略这两辆车之间的距离，也就是说，它们被假定处于相同的位置。
 * 车队是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意，一辆车也可以是一个车队。
 * 即便一辆车在目的地才赶上了一个车队，它们仍然会被视作是同一个车队。
 * 返回到达目的地的 车队数量 。
 *  输入：target = 12, position = [10,8,0,5,3], speed = [2,4,1,1,3]
 * 输出：3
 * 解释：
 * 从 10 和 8 开始的车会组成一个车队，它们在 12 处相遇。
 * 从 0 处开始的车无法追上其它车，所以它自己就是一个车队。
 * 从 5 和 3 开始的车会组成一个车队，它们在 6 处相遇。
 * 请注意，在到达目的地之前没有其它车会遇到这些车队，所以答案是 3。
 * 输入: target = 10, position = [3], speed = [3]
 * 输出: 1
 * 解释: 只有一辆车，因此只有一个车队。
 *   输入: target = 100, position = [0,2,4], speed = [4,2,1]
 * 输出: 1
 * 解释:
 * 以0(速度4)和2(速度2)出发的车辆组成车队，在4点相遇。舰队以2的速度前进。
 * 然后，车队(速度2)和以4(速度1)出发的汽车组成一个车队，在6点相遇。舰队以1的速度前进，直到到达目标。
 * n == position.length == speed.length
 * 1 <= n <= 105
 * 0 < target <= 106
 * 0 <= position[i] < target
 * position中每个值都 不同
 * 0 < speed[i] <= 106
 */
public class LeetCode853 {
    public static void main(String[] args) {
        int result1 = carFleet(12, new int[]{10,8,0,5,3}, new int[]{2,4,1,1,3});
        System.out.println(result1);
        System.out.println(carFleet(10, new int[]{3}, new int[]{3}));
        System.out.println(carFleet(100, new int[]{0,2,4}, new int[]{4,2,1}));
    }

    public static int carFleet(int target, int[] position, int[] speed) {
        int N = position.length;
        Car[] cars = new Car[N];
        for (int i = 0; i < N; i++) {
            cars[i] = new Car(position[i], (double) (target - position[i]) / speed[i]);
        }
        Arrays.sort(cars, Comparator.comparingInt(a -> a.position));
        int ans = 0;
        int t = N;
        while (--t > 0) {
            if (cars[t].time < cars[t - 1].time) {
                ans++;
            } else {
                cars[t - 1] = cars[t];
            }
        }
        return ans + (t == 0 ? 1 : 0);
    }
    static class Car {
        int position;
        double time;
        Car(int p, double t) {
            position = p;
            time = t;
        }
    }
}
